CommonMark-Spezifikation
Probieren Sie Markdown Dingus aus, um mit dem CommonMark-Prozessor (GFM) zu experimentieren.
Contents
Was ist CommonMark?
CommonMark ist eine genau spezifizierte, hochkompatible Implementierung von Markdown. Sie wurde entwickelt, um die Mehrdeutigkeiten und Inkonsistenzen in John Grubers ursprünglicher Markdown-Spezifikation zu beheben, die zu unterschiedlichen Implementierungen auf verschiedenen Plattformen und in verschiedenen Werkzeugen geführt hatten.
Warum CommonMark existiert
Die ursprüngliche Markdown-Spezifikation von John Gruber war in vielen Bereichen absichtlich mehrdeutig, sodass verschiedene Implementierungen sie unterschiedlich auslegten. Dadurch wurde dasselbe Markdown-Dokument auf verschiedenen Plattformen (GitHub, Stack Overflow, Reddit usw.) unterschiedlich gerendert.
CommonMark bietet:
- Eindeutige Vorgaben für die gesamte Markdown-Syntax
- Umfassende Testsuite, die konsistentes Verhalten gewährleistet
- Klare Vorrangregeln für widersprüchliche Syntax
- Detaillierten Parsing-Algorithmus, der sich konsistent implementieren lässt
Hauptunterschiede zu Standard-Markdown
1. Strengere Parsing-Regeln
CommonMark erzwingt ein konsistenteres Parsing-Verhalten:
Leerzeilen vor Blockelementen
- CommonMark erfordert Leerzeilen vor Überschriften, Blockzitaten und Listen
- Standard-Markdown erlaubt diese häufig ohne Leerzeilen
Text
# Heading
CommonMark: Erfordert eine Leerzeile vor der Überschrift
Standard-Markdown: oft ohne Leerzeile erlaubt
2. Analyse von Listenelementen
Einrückungsanforderungen
- CommonMark hat genaue Regeln für die Einrückung von Listenelementen
- Unterlisten müssen konsistent eingerückt werden (normalerweise 4 Leerzeichen).
- Standardimplementierungen von Markdown weichen hiervon ab
1. First item
- Sublist item (4 spaces required in CommonMark)
2. Second item
Listenfortsetzung
- CommonMark hat klare Regeln dafür, wann Listen „locker“ oder „kompakt“ sind
-
Lockere Listen umschließen Elemente mit
<p>-Tags, kompakte Listen nicht
3. Codeblock-Handhabung
-
CommonMark standardisiert die Syntax abgegrenzter Codeblöcke mit Backticks oder Tilden
-
Erfordert konsistente Einrückungs- und Schlussmarkierungen
code here
Eingerückte Codeblöcke
- CommonMark erfordert Leerzeilen vor eingerückten Codeblöcken
- Standard-Markdown erlaubt sie oft ohne Leerzeilen
4. Link- und Bildverarbeitung
Vorrang des Referenzlinks
- CommonMark hat klare Regeln, nach denen die Referenzdefinition Vorrang hat
- Mehrere Definitionen für dieselbe Referenz werden konsistent behandelt
[link1]: /url1
[link1]: /url2
[link1] <!-- Uses /url2 in CommonMark -->
Link-Parsing-Reihenfolge
- CommonMark verarbeitet Links vor der Hervorhebung
- Dies wirkt sich darauf aus, wie verschachtelte Syntax interpretiert wird
5. Hervorhebung und starke Hervorhebung
Verschachtelte Hervorhebungsregeln
-
CommonMark verwendet spezielle Algorithmen für verschachtelte
*- und_-Markierungen - Verhindert mehrdeutiges Parsen komplexer Hervorhebungsmuster
*foo *bar* baz* <!-- Clear precedence rules in CommonMark -->
Trennzeichenverarbeitung
- CommonMark verwendet einen „Trennzeichenstapel“-Algorithmus für eine konsistente Hervorhebungsanalyse
- Standardimplementierungen von Markdown unterscheiden sich in ihrem Ansatz
6. Verarbeitung von HTML-Blöcken
Erkennung von HTML-Blöcken
- CommonMark unterscheidet 7 Arten von HTML-Blöcken mit jeweils eigenen Regeln
- Jeder Typ hat unterschiedliche Anforderungen an die Start-/Endbedingungen
<div>
This is an HTML block in CommonMark
</div>
7. Behandlung von Zeilenumbrüchen
Harte Zeilenumbrüche
- CommonMark erfordert zwei Leerzeichen am Zeilenende für harte Umbrüche
- Einzelne Zeilenumbrüche werden zu weichen Umbrüchen (in HTML ignoriert)
Line one
Line two <!-- Two spaces before line break -->
8. Entitäts- und Zeichenreferenzen
Numerische Zeichenreferenzen
- CommonMark unterstützt sowohl dezimale als auch hexadezimale numerische Referenzen
- Die Unterstützung in Standardimplementierungen von Markdown variiert
— <!-- Decimal -->
— <!-- Hexadecimal -->
CommonMark-Parsing-Algorithmus
CommonMark verwendet einen zweiphasigen Parsing-Ansatz:
Phase 1: Blockstruktur
- Zeilenverarbeitung: Jede Zeile wird auf Markierungen auf Blockebene analysiert
- Containerblöcke: Blockzitate, Listen und andere Container werden identifiziert
- Blattblöcke: Überschriften, Codeblöcke und Absätze werden verarbeitet
- Referenzlinks: Linkdefinitionen werden zur späteren Verwendung gesammelt
Phase 2: Inline-Struktur
- Inline-Verarbeitung: Text innerhalb von Blöcken wird auf Inline-Elemente analysiert
- Hervorhebungsanalyse: Verwendet den Trennzeichenstapel-Algorithmus für eine konsistente Hervorhebung
- Linkauflösung: Referenzlinks werden anhand gesammelter Definitionen aufgelöst
- Entitätsverarbeitung: Zeichenreferenzen werden in tatsächliche Zeichen umgewandelt
Vorteile von CommonMark
- Vorhersehbares Verhalten: Dieselbe Eingabe erzeugt immer dieselbe Ausgabe
- Plattformübergreifende Kompatibilität: Funktioniert in verschiedenen Werkzeugen konsistent
- Umfassende Tests: Umfangreiche Testsuite sorgt für Zuverlässigkeit
- Klare Dokumentation: Detaillierte Spezifikationen beseitigen Unklarheiten
- Zukunftssicher: Klar definierte Erweiterungspunkte für neue Funktionen
Implementierungshinweise
CommonMark ist wie folgt konzipiert:
- Spezifikationskonform: Entspricht genau der offiziellen CommonMark-Spezifikation
- Testgesteuert: Besteht die offizielle CommonMark-Testsuite
- Erweiterbar: Kann unter Beibehaltung der Kompatibilität um zusätzliche Funktionen erweitert werden
- Schnell: Optimierte Parsing-Algorithmen sorgen für hohe Leistung
Ressourcen
- CommonMark-Spezifikation
- CommonMark-Testsuite
- CommonMark Dingus – Online-Testtool
- CommonMark-Diskussionsforum
Diese Dokumentation behandelt CommonMark 0.31.2 (28. Januar 2024). Die aktuellsten Informationen finden Sie in der offiziellen Spezifikation.
Next up: Kramdown-Spezifikation ▶
Support Site | Legal | Privacy